#include <bits/stdc++.h>
using namespace std;
const int N=100100;
int T;
    long long n,m,L,V,l[N]={},r[N]={};
    long long p[N]={};
    bool sx[N]={};
    vector<int>a[N];
    int ans=0,jans=N;
    void check(){
        bool h[N]={};
        int ta=0;
        for(int i=1;i<=m;i++){
            if(sx[i]){
                ta++;
                for(int j=0;j<a[i].size();j++){
                    h[a[i][j]]=true;
                }
            }
        }
        int ts=0;
        for(int i=1;i<=n;i++){
            if(h[i])ts++;
        }
        if(ts==ans)jans=min(jans,ta);
    }
    void dfs(int dep){
        if(dep == m+1){
            check();
            return;
        }
        sx[dep]=false;
        dfs(dep+1);
        sx[dep]=true;
        dfs(dep+1);
    }
void solve(){
    bool h=true;
    ans=0;jans=N;
    cin>>n>>m>>L>>V;
    for(int i=1;i<=m;i++)a[i].clear();
    for(int i=1;i<=n;i++){
        l[i]=0;r[i]=0;
        long long kd,kv,ka;
        cin>>kd>>kv>>ka;
        if(ka > 0){
            if(kv > V){
                l[i]=kd;
                r[i]=L;
            }
            else{
                long long kx=(V*V-kv*kv+2*ka)/(2*ka);
                if((kd+kx)<=L){
                    l[i]=kd+kx;
                    r[i]=L;
                }
            }
        }
        if(ka == 0){
            if(kv > V){
                l[i]=kd;
                r[i]=L;
            }
        }
        if(ka < 0){
            if(kv > V){
                long long kx=(-V*V+kv*kv-1)/(-2*ka);
                l[i]=kd;
                r[i]=min(L,kd+kx);
            }
        }
        if(r[i]!=0 && r[i]!=L)h=false;

    }
//    for(int i=1;i<=n;i++)cout<<l[i]<<' '<<r[i]<<endl;
    for(int i=1;i<=m;i++)cin>>p[i];
    if(h){
        long long lp=0;
        for(int i=1;i<=m;i++)lp=max(lp,p[i]);
        for(int i=1;i<=n;i++){
            if(r[i]!=0 &&lp>=l[i])ans++;
        }
        if(ans == 0)m++;
        cout<<ans<<' '<<m-1<<endl;
        return;
    }
    for(int i=1;i<=n;i++){
        int f=0;
        for(int j=1;j<=m;j++){
            if(p[j]>=l[i] && p[j]<=r[i]){
                a[j].push_back(i);
                f=1;
            }
        }
        ans+=f;
    }
    cout<<ans;
    dfs(1);
    cout<<' '<<m-jans<<endl;
}
int main(){
    ios::sync_with_stdio(false);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    while(T--)solve();
    return 0;
}
